package com.jeesite.modules.dao;

import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.auth.entity.AuthUser;
import org.springframework.stereotype.Repository;
import org.apache.ibatis.annotations.Param;

/**
 * 用户DAO接口
 * @author JeeSite
 * @version 2024-01-01
 */
@MyBatisDao
@Repository("authUserDao")
public interface UserDao extends CrudDao<AuthUser> {
    
    /**
     * 根据用户名查询用户
     * @param username 用户名
     * @return 用户信息
     */
    AuthUser findByUsername(@Param("username") String username);
    
    /**
     * 根据ID查询用户
     * @param id 用户ID
     * @return 用户信息
     */
    AuthUser findById(@Param("id") Long id);
    
    /**
     * 保存用户
     * @param user 用户信息
     * @return 影响行数
     */
    int save(@Param("user") AuthUser user);
    
    /**
     * 更新用户
     * @param user 用户信息
     * @return 影响行数
     */
    long update(@Param("user") AuthUser user);
    
    /**
     * 删除用户
     * @param id 用户ID
     * @return 影响行数
     */
    int delete(@Param("id") Long id);
    
    /**
     * 根据邮箱查询用户
     * @param email 邮箱
     * @return 用户信息
     */
    AuthUser getByEmail(@Param("email") String email);
    
    /**
     * 根据手机号查询用户
     * @param mobile 手机号
     * @return 用户信息
     */
    AuthUser getByMobile(@Param("mobile") String mobile);
    
    /**
     * 检查登录账号是否存在
     * @param loginCode 登录账号
     * @return 存在返回true，否则返回false
     */
    boolean existsByLoginCode(@Param("loginCode") String loginCode);
    
    /**
     * 检查邮箱是否存在
     * @param email 邮箱
     * @return 存在返回true，否则返回false
     */
    boolean existsByEmail(@Param("email") String email);
    
    /**
     * 检查手机号是否存在
     * @param mobile 手机号
     * @return 存在返回true，否则返回false
     */
    boolean existsByMobile(@Param("mobile") String mobile);
    
    /**
     * 检查用户名是否存在
     * @param username 用户名
     * @return 存在返回true，否则返回false
     */
    boolean existsByUsername(@Param("username") String username);
    
    /**
     * 更新用户信息
     * @param user 用户对象
     * @return 更新的行数
     */
    int updateUser(@Param("user") AuthUser user);
    
    /**
     * 更新用户最后登录信息
     * @param userCode 用户编码
     * @param lastLoginIp 最后登录IP
     * @param lastLoginDate 最后登录时间
     */
    void updateLastLoginInfo(@Param("userCode") String userCode, 
                           @Param("lastLoginIp") String lastLoginIp, 
                           @Param("lastLoginDate") java.util.Date lastLoginDate);
    
    /**
     * 更新用户密码
     * @param userCode 用户编码
     * @param password 新密码
     * @param pwdUpdateDate 密码更新时间
     */
    void updatePassword(@Param("userCode") String userCode, 
                       @Param("password") String password, 
                       @Param("pwdUpdateDate") java.util.Date pwdUpdateDate);
}